import { message, Modal } from 'antd';
import { stringify } from 'querystring';
import { history } from 'umi';
import axios from 'axios';
import { notification } from 'antd';
const service = axios.create({
  withCredentials: true, // 跨域请求时发送 cookies
  // timeout: 10000 // request timeout
});

// 添加请求拦截器
service.interceptors.request.use(
  config => {
    config.headers['Content-Type'] = 'application/json';
    return config;
  },
  error => {
    return Promise.reject(error);
  },
);

const reBack = () => {
  history.replace({
    pathname: '/user/login',
    search: stringify({
      redirect: window.location.href,
    }),
  });
};

// 添加响应拦截器
service.interceptors.response.use(
  function (response) {
    const code: string = response?.data?.responseCode;
    if (code === '4005') {
      message.error('登录失效请重新登录！');
      reBack();
      return;
    }

    if (code === '4006') {
      Modal.warning({
        icon: false,
        content: '您的账号已在其他电脑登录，已被迫下线。如不是您本人操作，您的密码很可能已泄露，建议您修改密码。',
        okText: '确定',
        onOk() {
          Modal.destroyAll();
          reBack();
        },
      });
    }

    if (response.headers['content-type']?.indexOf('application/octet-stream') !== -1) {
      // 二进制数据流直接返回整个response对象，方便做下载和获取文件名称处理，可以看调用queryExportWaterMonitorChart的处理
      return response;
    }

    return response.data;
  },
  (error): any => {
    console.log(error);

    if (error && error.response) {
      let errorMessage = '请求错误错误原因未知';
      switch (error.response.status) {
        case 400:
          errorMessage = '客户端请求的语法错误，服务器无法理解';
          break;
        case 401:
          errorMessage = '用户没有权限（令牌、用户名、密码错误）。';
          break;
        case 500:
          errorMessage = '服务器内部错误，无法完成请求';
          break;
        case 503:
          errorMessage = '由于超载或系统维护，服务器暂时的无法处理客户端的请求。';
          break;
      }
      notification.error({
        message: `请求错误 ${error.response.status}: ${error.response.config.url}`,
        description: errorMessage,
      });

      return null;
    }
  },
);

/**
 * 下载服务器返回的二进制数据流文件
 * @param blobData
 * @param fileName
 */
export function downloadFile(blobData, fileName) {
  let url = URL.createObjectURL(blobData);
  let a = document.createElement('a');
  a.href = url;
  a.download = fileName;
  a.click();
}

/**
 * 从标准response返回数据下载文件
 * @param response
 */
export function downloadFileFromResponse(response) {
  // 从header中获取服务端命名的文件名，服务端需要把文件名通过URLEncoder.encode转码，防止乱码，然后前端获取时解码
  const fileName = response?.headers?.filename ? decodeURIComponent(response.headers.filename) : 'exports.xls';
  downloadFile(new Blob([response.data]), fileName);
}

export default service;
